package com.epoint.juc.lock;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * Synchronized 和 Lock 区别
 * 1、Synchronized 内置的Java关键字， Lock 是一个Java类
 * 2、Synchronized 无法判断获取锁的状态，Lock 可以判断是否获取到了锁
 * 3、Synchronized 会自动释放锁，lock 必须要手动释放锁！如果不释放锁，死锁
 * 4、Synchronized 线程 1（获得锁，阻塞）、线程2（等待，傻傻的等）；Lock锁就不一定会等待下去；
 * 5、Synchronized 可重入锁，不可以中断的，非公平；Lock ，可重入锁，可以 判断锁，非公平（可以自己设置）；
 * 6、Synchronized 适合锁少量的代码同步问题，Lock 适合锁大量的同步代码！
 */
public class LockDemo {

    public static void main(String[] args) {
        Ticket ticket = new Ticket();

        new Thread(() -> {
            for(int i = 0; i < 50; i ++){
                ticket.sell();
            }
        }, "1").start();
        new Thread(() -> {
            for(int i = 0; i < 50; i ++){
                ticket.sell();
            }
        }, "2").start();
    }

}

class Ticket2{
    private int count = 100;

    /**
     * ReentrantLock是一个可重入的互斥锁。顾名思义，“互斥锁”表示在某一时间点只能被同一线程所拥有。
     * “可重入”表示锁可被某一线程多次获取。当然 synchronized 也是可重入的互斥锁
     */
    private Lock lock = new ReentrantLock();

    public void sell(){
        try{
            lock.lock();
            System.out.println(Thread.currentThread().getName() + "，当前剩余数量：" + count--);
        }finally {
            lock.unlock();
        }

    }
}

